'''
Description: 
Author: Zilu
Date: 2021-11-07 14:36:02
Version: 
LastEditTime: 2021-11-07 14:48:38
LastEditors: Zilu
'''

# 在变量名前面使用 __ 表示私有，只有类内部可以访问
class Student(object):
    def __init__(self, name, score) -> None:
        super().__init__()
        self.__name = name
        self.__score = score

    def print_score(self):
        print("%s: %s" % (self.__name, self.__score))

# 这样可以增加代码的健壮性
bart = Student("Bart Simpon", 59)
bart.__name

# 以一个下划线开头的实例变量名，比如_name，这样的实例变量外部是可以访问的.
# 但是，按照约定俗成的规定，当你看到这样的变量时，意思就是，“虽然我可以被访问，但是，请把我视为私有变量，不要随意访问”。

# 可以在代码中增加 set、get 方法修改和得到私有变量的值
# 以双下划线开头，并且以双下划线结尾是特殊变量，不是private的，自己定义的变量应该避免使用 __xxx__ 的形式

# 但是private变量不是真的不能访问，而是python解释器把它定义成了 _Student__name 的形式
bart._Student__name

# 强烈建议不要这么干，因为不同版本的Python解释器可能会把__name改成不同的变量名。

# 练习：请把下面的Student对象的gender字段对外隐藏起来，用get_gender()和set_gender()代替，并检查参数有效性
class ExerciseStudent(object):
    def __init__(self, name, gender):
        self.__name = name
        self.__gender = gender

    def get_gender(self):
        return self.__gender

    def set_gender(self, gender):
        if (gender != 'male' and gender != 'female'):
            raise ValueError("Bad gender argument")
        else:
            self.__gender = gender

